'''
工厂方法模式：
    内容：定义一个用于创建对象的接口（工厂接口）, 让子类决定实例化哪一个产品类。
    角色：
        - 抽象工厂角色（Creator）
        - 具体工厂角色（Concrete Creator）
        - 抽象产品角色（Product）
        - 具体产品角色（Concrete Product）
    优点：
        - 每个具体产品都对应一个具体工厂类, 不需要修改工厂类代码
        - 隐藏了对象创建的实现细节
    缺点：
        - 每增加一个具体产品类, 就必须增加一个相应的具体工厂类
'''

from abc import ABCMeta, abstractmethod

class Payment(metaclass=ABCMeta):

    @abstractmethod
    def pay(self, money):
        '''抽象产品角色'''
        pass

class Alipay(Payment):

    def pay(self, money):
        '''具体产品角色'''
        print("支付宝支付%d元" % money)

class WechatPay(Payment):

    def pay(self, money):
        '''具体产品角色'''
        print("微信支付%d" % money)

class PaymentFactory(metaclass=ABCMeta):

    @abstractmethod
    def create_payment(self):
        '''抽象工厂角色'''
        pass

class AlipayFactory(PaymentFactory):
    def create_payment(self):
        '''具体工厂角色'''
        return Alipay()

class WechatPayFactory(PaymentFactory):
    def create_payment(self):
        '''具体工厂角色'''
        return WechatPay()

pf = WechatPayFactory()
p = pf.create_payment()
p.pay(100)
